\subsection{Checagem de Tipos}

PHP é uma linguagem dinamicamente tipada e, por isso, não há
associação fixa de variáveis, expressões e parâmetros. Assim, dependendo do
trecho onde o programa esteja executando, eles podem assumir diferentes valores.
Além disso, ela também é fracamente tipada, já que ocorre conversão implícita,
como visto no Exemplo~\ref{lst:exemploFracamente}.

\begin{lstlisting}[frame=single,
caption={Exemplo de conversão implícita em PHP},label=lst:exemploFracamente,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 'fracamente tipada';
$b = 2;
echo $a + $b;
?>
\end{lstlisting}

A saída do código descrito será \texttt{2} pois PHP converte o valor da
\emph{String} avaliada em \texttt{\$a} com valor \texttt{0} - a linguagem faz
essa conversão para quaisquer \emph{strings}.

Outro exemplo simples que podemos mostrar, é o caso da conversão implícita de
inteiro em string apresentado no Exemplo~\ref{lst:exemplo2Fracamente}.

\begin{lstlisting}[frame=single,
caption={Exemplo de conversão implícita em PHP},label=lst:exemplo2Fracamente,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$a = 'Fracamente tipada, exemplo: ';
$b = 2;
echo $a . $b;
?>
\end{lstlisting}

Nesse exemplo, na linha 4, imprimimos a concatenação da expressão avaliada em
\texttt{\$a} com a de \texttt{\$b} e a saída sera \texttt{Fracamente tipada,
exemplo: 2}.

Diante do exposto, vemos que PHP não suporta sobrecarga independente de
contexto, pois não há a especificação dos tipos dos parâmetros em abstrações de funções ou
de procedimentos nem mesmo com a mudança na quantidade de parâmetros.

\begin{lstlisting}[frame=single,
caption={Exemplo de tentativa de sobrecarga em PHP},label=lst:exemploSobrecarga,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
function uma_funcao($um_parametro) {
    echo $um_parametro;
}

function uma_funcao($param1, $param2) {
    echo $param1 . $param2;
}
?>
\end{lstlisting}

O código do Exemplo~\ref{lst:exemploSobrecarga} deverá resultar em um erro com a
seguinte mensagem: \texttt{Fatal error: Cannot redeclare uma\_funcao()}. Esse erro nos mostra que um
programa em PHP não pode conter mais de uma declaração de função/procedimento com o mesmo identificador.
Outro bom exemplo para demonstrar o sistema de tipos de PHP, é encontrado em
~\ref{lst:exemploSistTipos}.

\begin{lstlisting}[frame=single,
caption={Exemplo de coerção},label=lst:exemploSistTipos,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
function funcao($parametro_qualquer) {
    echo $parametro_qualquer . " concatenado com essa string. ";
}

funcao(1);
funcao(True);
funcao("Um parametro");
funcao(2.3);
?>
\end{lstlisting}

A saída para o código ~\ref{lst:exemploSistTipos} será:

\begin{lstlisting}[frame=single,
caption={Saída do exemplo de coerção},label=lst:saidaTipos,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
1 concatenado com essa string. 1 concatenado com essa string. Um parametro concatenado com essa string. 2.3 concatenado com essa string.
\end{lstlisting}

Como o sistema de tipos da nossa linguagem é definido como descrito, surgiu uma
restrição muito grande sobre o que poderia ser checado na análise semântica do projeto do
compilador. A maioria dos erros que PHP explicita, são advindos de checagem em
tempo de execução. Logo, o nosso compilador não tem a possibilidade de realizar
a checagem de tipos com a análise semântica.
